#ifndef ATOM_HEADER_VIZMF_PROJECT
#define ATOM_HEADER_VIZMF_PROJECT

#include "src/core/generic/vector3.h"
#include <string>

/*
  VizMF Atom class
*/

class Atom {
public:
  typedef unsigned int int_type;
//  typedef float float_type;
  typedef double float_type;
  typedef std::string atom_type_type;
//	typedef float_type atom_type_type;	// as an alternative

  Atom(int_type num = 0, int_type elem = 0, const Vector3& coords = Vector3(), atom_type_type type = atom_type_type(), float_type charge = float_type())
    : number_(num), element_(elem), coords_(coords), type_(type), charge_(charge) {}

  //!! get / set members for all data should follow below...
  void setNumber(const int_type number) { number_ = number; }
  int_type number() const { return number_; }

  void setElement(const int_type element) { element_ = element; }
  int_type element() const { return element_; }

  void setCoords(const Vector3& v0) { coords_ = v0; }
  const Vector3& coords() const { return coords_; }

  void setAtomType(const atom_type_type& type) { type_ = type; }
  const atom_type_type& atomType() const { return type_; }

  void setCharge(const float_type charge) { charge_ = charge; }
  float_type charge() const { return charge_; }

  bool operator == (const Atom& other) const
  {
    return number_ == other.number_ && element_ == other.element_ && coords_ == other.coords_ && type_ == other.type_ && charge_ == other.charge_;
  }

private:
  int_type number_;
  int_type element_;
  Vector3 coords_;
  atom_type_type type_;
  float_type charge_;
};

#endif // ATOM_HEADER_VIZMF_PROJECT
